package englishChicken;
import java.util.Iterator;
import java.util.List;
import java.util.LinkedList;
import java.util.Set;
import java.util.HashSet;

public class Evento{

	private String id;
	private String uid;
	private String nombre;
	Double latitud;
	Double longitud;
	//private double localizacion[];
	private Set<Juego> juegosJ;
	private Set<Usuario> asistentesJ;
	private Set<Usuario> organizadoresJ;
	private String fechaInicio;
	private String fechaFinal;
	
	
	public Evento(){
		nombre = "vacio";
		latitud=new Double(0);
		longitud=new Double(0);	
		juegosJ = new HashSet<Juego>();
		asistentesJ = new HashSet<Usuario>();
		organizadoresJ = new HashSet<Usuario>();
		fechaInicio = "00-00-0000";
		fechaFinal = "00-00-0000";
	}
	
	/*public Evento(String n,double[] loc,List<String> j,List<String> a,List<String> o,String fechaI,String fechaF){
		nombre=n;
		latitud=loc[0];
		longitud=loc[1];	
		juegos.addAll(j);
		asistentes.addAll(a);
		organizadores.addAll(o);
		fechaInicio=fechaI;
		fechaFinal=fechaF;
	}*/
	
	/*public Evento(String n, double[] loc, String j, String a, String o, String fechaI, String fechaF){
		nombre=n;
		latitud=loc[0];
		longitud=loc[1];	
		juegos=new LinkedList<String>();
		asistentes=new LinkedList<String>();
		organizadores=new LinkedList<String>();
		juegos.add(j);
		asistentes.add(a);
		organizadores.add(o);
		fechaInicio=fechaI;
		fechaFinal=fechaF;
	}*/
	
	public String getNombre() {
		return nombre;
	}
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	public double[] getLocalizacion() {
		double[] ret=new double[2];
		ret[0]=latitud;
		ret[1]=longitud;
		return ret;
	}
	public void setLocalizacion(double[] localizacion) {
		latitud=localizacion[0];
		longitud=localizacion[1];
	}
	public String getFechaInicio(){
		return fechaInicio;
	}
	public void setFechaInicio(String fechaInicio){
		this.fechaInicio=fechaInicio;
	}
	public String getFechaFinal(){
		return fechaFinal;
	}
	public void setFechaFinal(String fechaFinal){
		this.fechaFinal=fechaFinal;
	}
	public List<String> getAsistentes() {
		List<String> pet=new LinkedList<String>();
		Iterator<Usuario> petIT=asistentesJ.iterator();
		while(petIT.hasNext()){
			Usuario petITAct=petIT.next();
			pet.add(petITAct.getId());
		}
		return pet;
	}
	public void setAsistentes(List<String> asistentes) {
		List<Usuario> pet=new LinkedList<Usuario>();
		Iterator<String> petIT=asistentes.iterator();
		AlmacenDeUsuarios adu=AlmacenDeUsuarios.getInstance();
		while(petIT.hasNext()){
			Usuario petITAct=adu.getUsuarioUid(petIT.next());
			pet.add(petITAct);
		}
		this.asistentesJ = new HashSet<Usuario>(pet);
	}
	public void setOrganizadores(List<String> organizadores) {
		List<Usuario> pet=new LinkedList<Usuario>();
		Iterator<String> petIT=organizadores.iterator();
		AlmacenDeUsuarios adu=AlmacenDeUsuarios.getInstance();
		while(petIT.hasNext()){
			Usuario petITAct=adu.getUsuarioUid(petIT.next());
			pet.add(petITAct);
		}
		this.organizadoresJ = new HashSet<Usuario>(pet);
	}
	public List<String> getJuegos() {
		List<String> pet=new LinkedList<String>();
		Iterator<Juego> petIT=juegosJ.iterator();
		while(petIT.hasNext()){
			Juego petITAct=petIT.next();
			pet.add(petITAct.getId());
		}
		return pet;
	}
	public void setJuegos(List<String> juegos) {
		List<Juego> pet=new LinkedList<Juego>();
		Iterator<String> petIT=juegos.iterator();
		AlmacenDeJuegos adu=AlmacenDeJuegos.getInstance();
		while(petIT.hasNext()){
			Juego petITAct=adu.getJuegoUid(petIT.next());
			pet.add(petITAct);
		}
		this.juegosJ = new HashSet<Juego>(pet);
	}
	public List<String> getOrganizadores() {
		List<String> pet=new LinkedList<String>();
		Iterator<Usuario> petIT=organizadoresJ.iterator();
		while(petIT.hasNext()){
			Usuario petITAct=petIT.next();
			pet.add(petITAct.getId());
		}
		return pet;
	}
	public int compareTo(Object arg0) {
		return this.nombre.compareTo(((Evento)arg0).getNombre());
	}
	public void addJugadorE(String jUid)
	{
		AlmacenDeUsuarios adu = AlmacenDeUsuarios.getInstance();
		
		boolean found = false;
				
        if (asistentesJ == null) {
                asistentesJ = new HashSet<Usuario>();
        } else if(adu.getUsuarioUid(jUid)!=null){
        	Iterator<String> iter = this.getAsistentes().iterator();
            while (iter.hasNext() && !found) {
            	String d = iter.next();
                if (d.compareTo(jUid)==0) {
                	found = true;
                }
           }
        }
        if (!found) {
                asistentesJ.add(adu.getUsuarioUid(jUid));
        }

	}
	
	public void removeJugadorE(String j1Uid, String j2Uid)
	{
		AlmacenDeUsuarios adu = AlmacenDeUsuarios.getInstance();
		boolean found = false;
		if(adu.getUsuarioUid(j1Uid)!=null && adu.getUsuarioUid(j2Uid)!=null){
			
			 Iterator<String> iter = this.getAsistentes().iterator();
		     while (iter.hasNext() && !found) {
		    	 String d=iter.next();
		         if (d.compareTo(j1Uid)==0) {		                	
		         found = true;		                	
		         if(esOrganizador(j2Uid) || j1Uid.compareTo(j2Uid)==0)
		        	 asistentesJ.remove(adu.getUsuarioUid(j1Uid));
		         }
		     }			
		}      
	}
	public boolean esOrganizador(String u)
	{
		boolean esOrg = false;
		
		 if (organizadoresJ == null) {
			 organizadoresJ = new HashSet<Usuario>();
	    } else {
	    	Iterator<String> it = this.getOrganizadores().iterator();
	    	while (it.hasNext() && !esOrg) {
               String d = it.next();
               if (d.equals(u)) {
               	esOrg=true;
               }
	    	}
	    }
       return esOrg;	
	}
	
	public void addJuegoE(String j, String u)
	{
		AlmacenDeUsuarios adu = AlmacenDeUsuarios.getInstance();
		AlmacenDeJuegos adj = AlmacenDeJuegos.getInstance();
		boolean found = false;

        if (juegosJ == null) {
        	juegosJ = new HashSet<Juego>();
        }
        if (adu.getUsuarioUid(u)!=null && esOrganizador(u)){
        	Iterator<String> iter = this.getJuegos().iterator();        	
            while (iter.hasNext() && !found) {
            	String jg = iter.next();
                if (jg.compareTo(j)==0) {
                        found = true;
                }
            }
        }
        if (!found) {
                juegosJ.add(adj.getJuegoUid(j));
        }
	}
	
	public void removeJuegoE(String j, String u)
	{
		AlmacenDeUsuarios adu = AlmacenDeUsuarios.getInstance();
		AlmacenDeJuegos adj = AlmacenDeJuegos.getInstance();
		boolean found = false;
        Iterator<String> iter = this.getJuegos().iterator();
        if(adu.getUsuarioUid(u)!=null && esOrganizador(u)){
        	while (iter.hasNext() && !found) {        		
                String d = iter.next();
                if (d.compareTo(j)==0) {
                        juegosJ.remove(adj.getJuegoUid(d));
                        found = true;                   	
                }
        	}        	
        }     

	}
	
	
	//TODO revisar este metodo que me parece raro :s
	public void addOrganizadorE(String jUid1, String jUid2)
	{		
		AlmacenDeUsuarios adu = AlmacenDeUsuarios.getInstance();
        if (organizadoresJ == null) {
        	organizadoresJ = new HashSet<Usuario>();
        } else if(adu.getUsuarioUid(jUid1)!=null && adu.getUsuarioUid(jUid2)!=null && esOrganizador(jUid2)){
        	if(!esOrganizador(jUid1))
        		organizadoresJ.add(adu.getUsuarioUid(jUid1));
        }

	}
	
	public void addOrganizadorE(String uid){
		AlmacenDeUsuarios adu = AlmacenDeUsuarios.getInstance();
		if(organizadoresJ==null){
        	organizadoresJ = new HashSet<Usuario>();
		}
		organizadoresJ.add(adu.getUsuarioUid(uid));
	}
	
	public void removeOrganizadorE(String jUid1, String jUid2)
	{
		AlmacenDeUsuarios adu = AlmacenDeUsuarios.getInstance();
		AlmacenDeEventos ade = AlmacenDeEventos.getInstance();
		if(adu.getUsuarioUid(jUid1)!=null && adu.getUsuarioUid(jUid2)!=null && esOrganizador(jUid2) && esOrganizador(jUid1)){
			organizadoresJ.remove(jUid1);
			if(organizadoresJ.size()==0)
				ade.borraEvento(uid);		    			
		}      
	}
	public String getUid() {
		return uid;
	}
	public void setUid(String uid) {
		this.uid = uid;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public Double getLatitud() {
		return latitud;
	}

	public void setLatitud(Double latitud) {
		this.latitud = latitud;
	}

	public Double getLongitud() {
		return longitud;
	}

	public void setLongitud(Double longitud) {
		this.longitud = longitud;
	}

	public Set<Juego> getJuegosJ() {
		return juegosJ;
	}

	public void setJuegosJ(Set<Juego> juegosJ) {
		this.juegosJ = juegosJ;
	}

	public Set<Usuario> getAsistentesJ() {
		return asistentesJ;
	}

	public void setAsistentesJ(Set<Usuario> asistentesJ) {
		this.asistentesJ = asistentesJ;
	}

	public Set<Usuario> getOrganizadoresJ() {
		return organizadoresJ;
	}

	public void setOrganizadoresJ(Set<Usuario> organizadoresJ) {
		this.organizadoresJ = organizadoresJ;
	}
	
}